grep from tar.gz without extracting [fast one]

您所在的位置:网站首页 grep zip文件 grep from tar.gz without extracting [fast one]

grep from tar.gz without extracting [fast one]

#grep from tar.gz without extracting [fast one]| 来源: 网络整理| 查看: 265

上面所有的代码真的很有帮助,但没有一个能完全满足我自己的需要。替换代码0】当前目录下的所有*.tar.gz文件,以找到一个可重复使用的脚本中指定为参数的模式来输出。

The name of both the archive file and the extracted file The line number where the pattern was found The contents of the matching line

这是我真正希望zgrep能够为我做的,但它就是做不到。

Here's my solution:

pattern=$1 for f in *.tar.gz; do echo "$f:" tar -xzf "$f" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true"; done

如果你想用一个基本的echo语句来测试所有的变量是否正常展开,你也可以用下面这行来替换tar。

tar -xzf "$f" --to-command 'echo "f:`basename $TAR_FILENAME` s:'"$pattern\""

让我解释一下发生了什么事。 希望有关档案文件名的for循环和echo是明显的。

tar -xzf。x提取,z通过gzip过滤,f基于以下存档文件。

"$f"。for循环提供的存档文件(比如你通过做ls得到的),用双引号表示,以允许变量扩展,并确保脚本不被任何带空格的文件名破坏,等等。

--to-command。将tar命令的输出传递给另一个命令,而不是真正地将文件提取到文件系统中。 在这之后的所有内容都指定了命令是什么(grep)以及我们要传递给该命令的参数。

让我们把这部分内容本身分解一下,因为它是这里的 "秘方"。

'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true"

首先,我们用一个单引号来开始这个块,这样,被执行的子命令(basename $TAR_FILENAME)就是not立即扩大/解决。 稍后再谈这个问题。

grep。要对(实际没有)提取的文件运行的命令

--label=。在结果前加上的标签,其值用双引号括起来,因为我们的do想让grep命令解决由tar命令传入的$TAR_FILENAME环境变量。

basename $TAR_FILENAME。以命令形式运行(周围有反斜线),删除目录路径,只输出文件名。

-Hin:H。显示文件名(由标签提供),i。不区分大小写的搜索,n。显示匹配的行数

然后我们用单引号 "结束 "命令字符串的第一部分,用双引号启动下一部分,这样作为第一个参数传入的$pattern就可以被解决。

意识到我需要在什么地方使用哪些引语,是最让我头疼的部分。 希望这一切对你来说是有意义的,并能帮助别人。 另外,我希望一年后当我再次需要它时能找到它(而且我已经忘记了我为它做的脚本!)。

自从我写下上述内容以来,已经过了几个星期,它仍然超级有用......但随着文件的堆积,搜索东西变得越来越乱,它还不够好。 我需要一种方法,通过文件的日期来限制我看的东西(只看最近的文件)。 所以这就是那段代码。 希望它是不言自明的。

if [ -z "$1" ]; then echo "Look within all tar.gz files for a string pattern, optionally only in recent files" echo "Usage: targrep [start date]" fi pattern=$1 startdatein=$2 startdate=$(date -d "$startdatein" +%s) for f in *.tar.gz; do filedate=$(date -r "$f" +%s) if [[ -z "$startdatein" ]] || [[ $filedate -ge $startdate ]]; then echo "$f:" tar -xzf "$f" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true" fi done

而且我无法停止调整这个东西。 我增加了一个参数,可以通过tar文件中的输出文件的名称进行过滤。 通配符也可以工作。

使用方法。

targrep.sh [-d ] [-f ]

例子。

targrep.sh -d "1/1/2019" -f "*vehicle_models.csv" ford

while getopts "d:f:" opt; do case $opt in d) startdatein=$OPTARG;; f) targetfile=$OPTARG;; esac done shift "$((OPTIND-1))" # Discard options and bring forward remaining arguments pattern=$1 echo "Searching for: $pattern" if [[ -n $targetfile ]]; then echo "in filenames: $targetfile" fi startdate=$(date -d "$startdatein" +%s) for f in *.tar.gz; do filedate=$(date -r "$f" +%s) if [[ -z "$startdatein" ]] || [[ $filedate -ge $startdate ]]; then echo "$f:" if [[ -z "$targetfile" ]]; then tar -xzf "$f" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true" else tar -xzf "$f" --no-anchored "$targetfile" --to-command 'grep --label="`basename $TAR_FILENAME`" -Hin '"$pattern ; true" fi fi done


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3